大規模MMORPGの設計方針やインフラを知る #reinvent
こんにちは。ゲームソリューション部の出村です。
AWS re:Invent 2022 のセッションである「Building a successful Korean MMORPG with KakaoGames」のレポートをお届けします。
セッション概要
kakaoGames recently launched the massive multiplayer online role-playing game (MMORPG) “Odin: Valhalla Rising” on AWS. The game became one of the most successful games in Korean game industry history, with 400,000 DAU and $2M daily revenue. In this session, attendees can learn how kakaoGames maximized their game server performance by selecting the right type of instances, optimizing a Windows operating system, and adopting Amazon Aurora as a main database. Find out what lessons were learned during kakaoGames’ customer journey, how MMORPGs are architected on AWS, and why kakaoGames chose AWS.
スピーカー
- JONGGEUN YOUN, technical project manager, kakaogames
- moonkwon Kim, Service develoment team leader, Lionheart studio
- Minsuk Kim, Solutions Architect, AWS
アジェンダ
KakaoGamesからリリースされた“Odin: Valhalla Rising”ではゲームサーバがAWSで稼働しています。ゲームを開発、運用するにあたってのアーキテクチャやAWSの様々なサービスをどのように活用しているのかについて紹介がありました。
このエントリーではゲームサーバーとデータベースについて解説していきます。このセッションでは他に分析インフラについても触れられていました。詳細については、AWS re:Invent 2022 - Building a successful Korean MMORPG with KakaoGames (GAM201) - YouTubeで述べられているので、そちらをご覧ください。
内容
Odin : Valhalla Rising
今回のセッションで取り上げているゲームです。こちらのゲームは多くのユーザーが遊ぶことができる MMORPG としてリリースされました。
コンテンツの中には、PvE、PvPコンテンツがあります。PvPコンテンツの一部では、他のサーバーにいるユーザと一緒に遊ぶことができます。またPvEコンテンツとしてはレイドバトルがあります。
ゲームサーバの役割
ゲームサーバの役割には、次のものがあります。
- AI : NPCやモンスターなど
- 各種の確率の制御 : 攻撃成功、アイテムドロップなど
- 他プレイヤーとの同期 : HP、ダメージ、キャラクターのイチなど
- ネットワーク : クライアントと接続
- データ保存 : アイテム、敵、プレイヤー情報
- チート防止 : パケット操作など
ゲームサーバ
ゲームサーバはEコマースなどのWebサーバとは、いろいろな面で異なります。
ゲームサーバは、TCP/IPを使ったステートフルなサーバです。これは、ユーザとの通信がより速く処理できるようにするためです。 ゲームサーバの役割としては、プレイヤー情報の処理や保存の役割などを行っています。また、起動時には、大量のデータをメモリに読み込むといった処理も行っています。
データベースは、あくまでユーザ情報の保持のために利用されます。ゲームで頻繁に参照されるデータはメモリ上にあり、データベースはそれらのユーザ情報が消失しないようにバックアップの役割として利用されています。
シングルスレッドで構成されている
このゲームのゲームサーバーは基本的にシングルスレッドで構成されています。MMORPGは長期運用される事が多く、その時にコンテンツの追加などが行われたりします。そのため、ゲームサーバは理解しやすい構造にしておく必要があります。そのため、ゲームロジックはシングルスレッドで構成されています。
シングルスレッドを選択した理由としては「開発が容易になる」「コードがシンプルになる」などの理由があります。
そのためゲームサーバを担当したエンジニアは6人でしたが、これだけの機能を実装することができました。
またクラッシュする回数も他のゲームに比べると圧倒的にへり、非常に安定したゲームサーバとなりました。
ゲームサーバのアーキテクチャは次のようになっています。ユーザはクライアントを起動します。そのクライアントは最初にログインサーバにアクセスします。そこでユーザ認証が行われたあとにゲートウェイサーバに接続され、ゲームのワールドを選択した後にゲームサーバに接続されます。
シングルスレッドの性能を計測する
様々なEC2インスタンスタイプに対してシングルスレッドのパフォーマンスを計測してみました。EC2上で動作しているWindowsのタスクマネージャで確認しましたが、バーチャルマシーンベースのEC2に関しては、その結果は参考になりませんでした。
そのため、EC2のベアメタルインスタンスをシングルスレッドのベンチマーク計測で利用しました。
EC2をチューニングする
今回のシングルスレッドのMMORPGのサーバとしてWindowsサーバを利用する際、Windowsサーバに対して、いくつか最適化できる箇所があります。
まずはネットワーク関連の設定です。Amazon ENAの設定を変更します。こちらで受信するバッファのサイズをサポートしている最大サイズの8192に変更します(デフォルトは1024)。これでパケットロスを防ぎます。
次にパフォーマンスを引き出すために、OS自体の設定を変更します。receive side scaling(RSS)自体はデフォルトで有効化されています。receive side scalingとはマルチコアで受信制御をする仕組みをさします。有効化されていることで、マルチコアで処理されることになります。ただ、これをもっとRSSが活用できるように設定を変更します。
EC2インスタンス上をシングルスレッドで活用するためには、マネージドコンソールで設定を変更します。通常はマルチスレッドが有効化されていますが、”Threads per core”に1を設定してマルチスレッドを無効化します。
ゲームサーバまとめ
ゲームサーバのまとめは次の通りです。EC2は仮想サーバであって物理サーバではないので、パフォーマンスを引きだすには、いろいろと設定する必要があるってことですね。
データベース
データベースを複数の選択肢から選ぶ必要があります。ゲームが1つのゲームロジックスレッドで動作しているので、データベースがそれにあわせて活用できるようにしなければなりません。そのために以下の点を重要視しました。
- スループットよりレイテンシーを重視する。
- ゲームサーバとして利用する場合の適切なコネクションスレッドプール数
- コンテキストスイッチの切り替えがどの程度行われるのか
処理速度が速いAuroraのインスタンスというのはサポートされていません。複数のコアを使って全体的なパフォーマンスを向上させる仕組みとなっています。 そのため、いろいろベンチマークなどをとってインスタンスタイプを決めました。
まとめ
このようなMMORPGの裏側を少しだけ見ることができて非常に勉強になりました。
またこのようなゲームサーバーを作る際には非常にシンプルな作りにして長く運用できるようにしておくという下地作りが大事だということもよくわかりました。